﻿package br.gov.bcb.app.stuff.util.props;

/**
 * Classe utilitária para criação de objetos que possibilitam a obtenção dos nomes de propriedades
 * sem utilização de string literals.
 */
public class PropertyUtils {

    /**
     * Retorna o objeto a ser utilizado para obter os nomes das propriedades. A classe passada como
     * parâmetro não pode ser final: neste caso uma exceção será lançada.
     * 
     * @param <T> - tipo do objeto
     * @param clazz - classe do objeto
     * @throws IllegalArgumentException - caso clazz seja final
     */
    public static <T> T getPropertyObject(Class<T> clazz) throws IllegalArgumentException {

        return PropertyUtilsControl.get().createPropertyObject(clazz);
    }

    /**
     * Método utilizado para obter o nome da propriedade. Caso tenhamos a chamada de getters de
     * maneira aninhada e um deles retorne uma classe final, este método retornará null, ao invés
     * do nome da propriedade.
     * 
     * @param obj - chamada ao getter da propriedade em questão
     */
    public static String property(Object obj) {

        PropertyUtilsControl propertyUtilsControl = PropertyUtilsControl.get();
        String property = propertyUtilsControl.getLastPropertyCalled();
        propertyUtilsControl.clear();
        return property;
    }
}